# -*- coding: utf-8 -*-
# @Time    : 2024/7/1 14:14
# @Author  : yujiahao
# @File    : 07_numpy_bit_operation.py
# @description:NumPy位运算


import numpy as np

"""
这里可以复习一下之前Python中提到的进制和转换问题，这里便于理解用的都是二进制，可以直观的看到计算的位数变化

NumPy 位运算函数示例：

1. bitwise_and
   - 函数：numpy.bitwise_and(x1, x2)
   - 描述：计算两个数组元素之间的按位与运算。按位与运算会对两个数的每一位进行比较，如果两个数的对应位都为 1，则结果为 1，否则为 0。
   - 示例：
     a = np.array([0b1100, 0b1010])
     b = np.array([0b1010, 0b1100])
     result = np.bitwise_and(a, b)
     print("按位与运算结果:", result)
     # 输出: [8 8]
     # 解释：0b1100 & 0b1010 和 0b1010 & 0b1100 的结果都是 0b1000，即十进制的 8。

2. bitwise_or
   - 函数：numpy.bitwise_or(x1, x2)
   - 描述：计算两个数组元素之间的按位或运算。按位或运算会对两个数的每一位进行比较，如果两个数的对应位有一个为 1，则结果为 1，否则为 0。
   - 示例：
     a = np.array([0b1100, 0b1010])
     b = np.array([0b1010, 0b1100])
     result = np.bitwise_or(a, b)
     print("按位或运算结果:", result)
     # 输出: [14 14]
     # 解释：0b1100 | 0b1010 和 0b1010 | 0b1100 的结果都是 0b1110，即十进制的 14。

3. invert
   - 函数：numpy.invert(x)
   - 描述：计算数组元素的按位取反运算。按位取反运算会对每个数的每一位进行反转，即 0 变为 1，1 变为 0。
   - 示例：
     a = np.array([0b1100, 0b1010], dtype=np.uint8)
     result = np.invert(a)
     print("按位取反运算结果:", result)
     # 输出: [243 245]
     # 解释：0b1100 的按位取反结果是 0b0011，即十进制的 243（因为取反后，按补码表示法计算）；0b1010 的按位取反结果是 0b0101，即十进制的 245。

4. left_shift
   - 函数：numpy.left_shift(x1, x2)
   - 描述：将二进制数的位数向左移。左移操作会将数的二进制表示向左移动若干位，右侧的空位用 0 填充。
   - 示例：
     a = np.array([0b0001, 0b0010])
     result = np.left_shift(a, 2)
     print("左移运算结果:", result)
     # 输出: [4 8]
     # 解释：0b0001 << 2 的结果是 0b0100，即十进制的 4；0b0010 << 2 的结果是 0b1000，即十进制的 8。

5. right_shift
   - 函数：numpy.right_shift(x1, x2)
   - 描述：将二进制数的位数向右移。右移操作会将数的二进制表示向右移动若干位，左侧的空位用 0 填充。
   - 示例：
     a = np.array([0b0100, 0b1000])
     result = np.right_shift(a, 2)
     print("右移运算结果:", result)
     # 输出: [1 2]
     # 解释：0b0100 >> 2 的结果是 0b0001，即十进制的 1；0b1000 >> 2 的结果是 0b0010，即十进制的 2。
"""

# 示例代码
# 1. bitwise_and
a = np.array([0b1100, 0b1010])
b = np.array([0b1010, 0b1100])
result = np.bitwise_and(a, b)
print("按位与运算结果:", result)

# 2. bitwise_or
result = np.bitwise_or(a, b)
print("按位或运算结果:", result)

# 3. invert
a = np.array([0b1100, 0b1010], dtype=np.uint8)
result = np.invert(a)
print("按位取反运算结果:", result)

# 4. left_shift
a = np.array([0b0001, 0b0010])
result = np.left_shift(a, 2)
print("左移运算结果:", result)

# 5. right_shift
a = np.array([0b0100, 0b1000])
result = np.right_shift(a, 2)
print("右移运算结果:", result)
